#ifndef __TIMER_H__
#define __TIMER_H__
#ifdef __cplusplus
extern "C"
{
#endif
    /*
        Chinese is encoded in Unicode. If it is garbled, please change the encoding method of the editor.
        定时器库 By启凡科创 适用于STC8/STC15平台MCU

        工作于16位自动溢出重装载模式

        version:v1.0.2  2023-4-5
    */

#include "LIB_CONFIG.h"

// 如果配置文件未使能，则可更改此参数用户自定义，0禁用模块不不编译，1启用模块
#ifndef TIMER0_EN
#define TIMER0_EN 0 // 定时器0
#endif

#ifndef TIMER1_EN
#define TIMER1_EN 0 // 定时器1
#endif

#ifndef TIMER2_EN
#define TIMER2_EN 0 // 定时器1
#endif

#ifndef TIMER3_EN
#define TIMER3_EN 0 // 定时器1
#endif

#ifndef TIMER4_EN
#define TIMER4_EN 0 // 定时器1
#endif

// 1回调函数指针将存储在xdata，0放在内部RAM(高速)
#define RAM_USE_XDATA 0

#if (TIMER0_EN || TIMER1_EN || TIMER2_EN || TIMER3_EN || TIMER4_EN)

    typedef enum
    {
#if TIMER0_EN
        TIMER0,
#endif
#if TIMER1_EN
        TIMER1,
#endif
#if TIMER2_EN
        TIMER2,
#endif
#if TIMER3_EN
        TIMER3,
#endif
#if TIMER4_EN
        TIMER4
#endif
            TIMER_USE_NUM
    } TIMER_TYPE; // 启用的定时器编号，如未启用将无法调用

    typedef enum
    {
        TIMER_WORK_AT_1T,  // 定时器工作在1T模式
        TIMER_WORK_AT_12T, // 定时器工作在12T（12分频）模式
    } TIMER_WORKE_TYPE;

    /**
     * @brief 配置定时器参数，为寄存器配置方式
     *
     * @param TIMER 定时器编号:
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     * @param --
     * @param mode 定时器工作模式:
     * @param ··WORK_ON_1T
     * @param ··WORK_ON_12T
     * @param --
     * @param TH_val 定时计数器高八位
     * @param TL_val 定时计数器低八位
     */
    void timer_config_seg(TIMER_TYPE TIMER, TIMER_WORKE_TYPE mode, uint8_t TH_val, uint8_t TL_val);

    /**
     * @brief 配置定时器参数，为时间配置方式
     *
     * @param TIMER 定时器编号:
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     * @param --
     * @param cpu_frq 处理器工作频率，如工作在24M时为24000000，注意：个位和十位将自动舍去取0,
     * @param ,如需非整数工作频率的高精度定时，请采用寄存器配置接口
     * @param --
     * @param time 定时中断的时间，单位Nus，建议不要过低，可能导致系统中断频繁死机，一般取1ms(1000)
     * @param ,注意：个位和十位将自动舍去取0，也就是精度为100us一个等级
     * @param ,如需非整数工作频率的高精度定时和更快的定时中断，请采用寄存器配置接口
     *
     * @return uint8_t 成功返回1，失败返回0
     */
    uint8_t timer_config_time(TIMER_TYPE TIMER, uint32_t cpu_frq, uint32_t time);

    /**
     * @brief 绑定指定定时器的中断执行函数，仅能绑定一个函数,新绑定的将会覆盖之前的函数
     *
     * @param TIMER 定时器编号:
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     * @param --
     * @param fun_cb 回调函数，格式为void func_name()类型
     */
    void timer_attach(TIMER_TYPE TIMER, void (*fun_cb)());

    /**
     * @brief 指定定时器开始工作，必须在使用timer_config函数进行配置后才能启用，
     * @brief 如果在begin之前已经通过接口timer_attach 注册了中断函数，则会自动同步开启中断服务，
     * @brief 如不需中断，则可以在开启后使用接口timer_interrupt_disable 进行中断服务的关闭，
     * @brief 也可以在begin之前不注册中断回调函数就不会开启中断功能，仅开启计数
     *
     * @param TIMER 定时器编号:
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     */
    void timer_begin(TIMER_TYPE TIMER);

    /**
     * @brief 定时器计数清零
     *
     * @param TIMER
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     */
    void timer_count_clr(TIMER_TYPE TIMER);

    /**
     * @brief 获取定时器计数值
     *
     * @param TIMER
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     * @return uint16_t (TH << 8 | TL)
     */
    uint16_t timer_get_count(TIMER_TYPE TIMER);

    /**
     * @brief 指定定时器开启中断
     *
     * @param TIMER 定时器编号：
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     */
    void timer_interrupt_enable(TIMER_TYPE TIMER);

    /**
     * @brief 指定定时器停止中断，计数不受影响
     *
     * @param TIMER 定时器编号
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     */
    void timer_interrupt_disable(TIMER_TYPE TIMER);

    /**
     * @brief 指定定时器停止工作,将自动注销已注册的回调函数
     *
     * @param TIMER 定时器编号:
     * @param ··TIMER0
     * @param ··TIMER1
     * @param ··TIMER2
     * @param ··TIMER3
     * @param ··TIMER4
     */
    void timer_end(TIMER_TYPE TIMER);

#endif
#ifdef __cplusplus
}
#endif

#endif
